package seu.xml.analysis;

import java.util.HashSet;
/**
 * UML图实体，用于表示UML图中所有组件
 * @author cy
 *
 */
public class UMLEntity {
	private int id;//唯一标识id
	private int x;
	private int y;
	private int w;
	private int h;
	public Element UMLEntityElement;//保存Element全部内容
	public HashSet<Integer> ralationID;//存储与该实体关联的边
	
	public HashSet<Integer> externalEntity;//存储该实体所在的外部实体（外部嵌套）
	public HashSet<Integer> internalEntity;//存储该实体的内部实体（内部嵌套）
	public HashSet<Integer> internalRelation;//存储实体的内部关系
	/**
	 * UMLEntity构造函数
	 * @param id UMLEntity唯一标识id
	 * @param e 实体元素
	 */
	public UMLEntity(int id,Element e){
		this.id = id;
		this.UMLEntityElement = e;
		ralationID = new HashSet<Integer>();
		externalEntity = new HashSet<Integer>();
		internalEntity = new HashSet<Integer>();
		internalRelation = new HashSet<Integer>();
		x = e.getX();
		y = e.getY();
		w = e.getW();
		h = e.getH();
	}
	/**
	 * 判断顶点(a,b)是否在该实体边缘
	 * @param a x轴坐标
	 * @param b y轴坐标
	 * @return 如果在实体上，返回true，否则返回false
	 */
	public boolean hasPoint(int a,int b){
		
		if(a>=x&&a<=(x+w)&&y<=b&&b<=(y+h)){
			if((a-x)*(a-x-w)*(b-y)*(b-y-h)==0)
				return true;
			else return false;
		}
		else 
			return false;
	}
	/**
	 * 判断顶点(a,b)是否在该实体内部（包括边缘）
	 * @param a x轴坐标
	 * @param b y轴坐标
	 * @return 如果在实体上，返回true，否则返回false
	 */
	public boolean hasPointIn(int a,int b){
		
		if(a>=x&&a<=(x+w)&&y<=b&&b<=(y+h)){
			//System.out.println("a:"+a+"b:"+b+"x:"+x+"y:"+y+"w:"+w+"h:"+h);
			return true;}
		else 
			return false;
	}
	/**
	 * 判断关系是否在实体内部
	 * @param a 关系起点x坐标
	 * @param b 关系起点y坐标
	 * @param c 关系终点x坐标
	 * @param d 关系终点y坐标
	 * @return 关系在该实体内部返回true，否则返回false
	 */
	public boolean hasinternalRelation(int a,int b,int c,int d){
		return hasPointIn(a,b)&&hasPointIn(c,d);
	}
	/**
	 * 判断实体是否在该实体内部
	 * @param a 实体左上角x坐标
	 * @param b 实体左上角y坐标
	 * @param c 实体右下角x坐标
	 * @param d 实体右下角y坐标
	 * @return 实体在该实体内部返回true，否则返回false
	 */
	public boolean hasinternalEntity(int a,int b,int c,int d){
		return hasPointIn(a,b)&&hasPointIn(a+c,b+d);
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getX() {
		return x;
	}
	public int getY() {
		return y;
	}
	public int getW() {
		return w;
	}
	public int getH() {
		return h;
	}
}
